// node 8_将0移动到数组末尾.js

//fill() 数组填充，第一个参数为填充值，二参和三参为填充范围

//例:
//  原 数 组:[0,1,0,3,12]
//  目标数组:[1,3,12,0,0]

let arr = [0,0,1,0,3,12]

//使用了额外的数组
let newArr1 = arr.filter( i => i )
let index1 = arr.length - newArr1.length
console.log("使用了额外的数组:")
console.log(newArr1.concat(...Array(index1).fill(0)))


//条件:必须在原有数组上操作，不能用额外的数组

//方法1:
//遍历数组，遇到0将其删除并在最后添加一个0
function operateArr1(arr) {
    let newArr = [...arr]
    let index = 0  //用来及时阻断遍历，避免重复遍历后添加的0
    for(let i=0;i<newArr.length-index;i++){
        if(newArr[i] === 0){
            newArr.splice(i,1)
            newArr.push(0)
            index++
            i-- //splice()改变了原数组的索引值，所以需要重新定位索引
        }
    }
    console.log("方法1:")
    console.log(newArr)
}

//方法2:
function operateArr2(arr) {
    let newArr = [...arr]
    let index = 0 //记录遇到0的个数
    for(let i=0;i<newArr.length;i++){
        if(newArr[i] === 0){
            index++
        }else if(index !== 0){
            newArr[i - index] = newArr[i]
            newArr[i] = 0
        }
    }
    console.log("方法2:")
    console.log(newArr)
}

operateArr1(arr)
operateArr2(arr)
console.log("原数组:")
console.log(arr)